class Persion {
  String name = '';
  late int age; // late关键词：延迟初始化age
  String _sex = ''; // _ 设置一个属性为私有属性

  static int height = 180; // 静态属性

  // Persion(String name, int age) {
  //   this.name = name;
  //   this.age = age;
  // }
  // 实例化之前给name、age赋值
  // Persion(): name = 'tikeyc', age = 18 {}
  // Persion(this.name, this.age): name = 'tikeyc', age = 18 {
  //   print('name:$name--age:$age');
  // }
  Persion(this.name, this.age);

// 命名构造方法
  Persion.constrc1(String name, int age) {
    this.name = name;
    this.age = age;
  }
  Persion.constrc2(this.name, this.age);
  // required关键字: 必须传入的参数
  Persion.constrc3({required this.name, required this.age});

  printUserInfor() {
    // print('name:${this.name}--age:${this.age}');
    print('name:$name--age:$age');

    _printUserInforSex();
  }

  // _ 设置一个方法为私有方法
  _printUserInforSex() {
    // print('name:${this.name}--age:${this.age}');
    print('sex:$_sex--height:$height');
  }

  set sexValue(value) {
    _sex = value;
  }

  get getSexValue {
    return _sex;
  }

  static getHeight() {
    return height;
  }
}

class Web extends Persion {
  int width = 0;
  Web(String name, int age, int width) : super(name, age) {
    this.width = width;

    printUserInfor();
  }

  @override
  printUserInfor() {
    super.printUserInfor();
    print('name:$name--age:$age-width:$width');
  }
}

// 抽象类
abstract class Animal {
  // 抽象方法
  init();

  // 抽象方法
  eat();

  printInfor() {
    print('抽象类中的普通方法');
  }
}

class Dog extends Animal {
  @override
  init() {
    print('继承抽象类，必须实现抽象方法init');
  }

  @override
  eat() {
    print('继承抽象类，必须实现抽象方法eat');
  }
}

// 抽象类当作接口 interface
abstract class Db {
  String url = '';
  add();
  save();
  delete();
}

abstract class Db2 {
  inset();
}

class MySqlit implements Db, Db2 {
  @override
  String url = 'https://xxx';

  MySqlit(this.url);

  @override
  add() {
    print('MySqlit add');
  }

  @override
  delete() {
    print('MySqlit delete');
  }

  @override
  save() {
    print('MySqlit save');
  }

  @override
  inset() {
    print('MySqlit inset');
  }

  void run() {
    print('MySqlit run');
  }
}

// mixins不是继承，实现类似多继承功能
mixin class A {
  String info = 'this is A';
  // A(); // 不能写构成函数
  void printA() {
    print('printA');
  }

  void run() {
    print('A run');
  }
}

mixin class B {
  // B(); // 不能写构成函数
  void printB() {
    print('printB');
  }

  void run() {
    print('B run');
  }
}

class MyMixins extends MySqlit with B, A {
  // B, A的顺序将导致A覆盖B和MySqlit中的相同方法
  MyMixins(super.url);
}
